package com.ldq.properties.util;

//import java.io.FileInputStream;
//import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.util.DefaultPropertiesPersister;
import org.springframework.util.PropertiesPersister;
/**
 * 
 * @ClassName: PropertiesUtil
 * @Description: 配置文件读取
 * @author ldq
 * @date 2020-04-23 22:39:19
 */
public class PropertiesUtil {

	private static final Logger logger = LoggerFactory.getLogger(PropertiesUtil.class);

	private static final String DEFAULT_ENCODING = "UTF-8";
	
	/**
	 * properties配置文件，设置好需要加载的配置文件
	 */
	private static final String[] configFiles = {"config", "db", "redis"};
	
	private static Properties props;
	
	private static PropertiesPersister propertiesPersister;
	
	/**
	 * 获取当前运行环境配置
	 */
	private static String ENV_KEY = "spring.profiles.active";//
	
	//加载单个文件
//	static void loadProps(){
//        logger.info("开始加载properties文件内容.......");
//        
//        String config_dev = System.getenv(ENV_KEY);
//		if(StringUtils.isBlank(config_dev)) {
//			logger.error("未获取到当前运行环境配置！");
//			return ;
//		}
//        
//        props = new Properties();
//        InputStream in = null;
//        try {
//            // 要加载的属性文件  
//        	//获取config.properties文件所在的父目录
//        	//String path = Thread.currentThread().getContextClassLoader().getResource("").getPath();
//        	//in = new FileInputStream(path + "/config_" + config_dev + "/config_" + config_dev + ".properties");
//            
//        	//要加载的属性文件 
//        	in = PropertiesUtils.class.getClassLoader().getResourceAsStream(
//        				"config_" + config_dev + "/config_" + config_dev + ".properties");
//            props.load(in);
//        } catch (FileNotFoundException e) {
//            logger.error("配置文件加载异常，文件未找到");
//        } catch (IOException e) {
//            logger.error("配置文件加载异常，出现IOException");
//        } finally {
//            try {
//                if(null != in) {
//                    in.close();
//                }
//            } catch (IOException e) {
//                logger.error("配置文件加载异常，文件流关闭出现异常");
//            }
//        }
//        logger.info("加载properties文件内容完成...........");
//        logger.info("properties文件内容：" + props);
//    }
	 
	
	static {
		//加载多个配置文件
		loadProperties(configFiles);
		
		//加载单个文件
		//loadProps();
	}
	
	/**
	 * 载入多个ClassPath中的properties文件, 相同的属性将会覆盖之前的载入.
	 */
	static void loadProperties(String[] configFiles) {
		
		logger.info("开始加载properties文件内容.......");
		
		propertiesPersister = new DefaultPropertiesPersister();
		props = new Properties();
		
		//读取系统环境变量（当前配置的是哪个运行环境）
		String config_dev = System.getenv(ENV_KEY);
		if(StringUtils.isBlank(config_dev)) {
			logger.error("未获取到当前运行环境配置！");
			return ;
		}
			
		for (String configFile : configFiles) {
			 
			logger.info("load properties file from classpath:" + configFile);
			
			InputStream is = null;
			try {
				Resource resource = new ClassPathResource("config_" 
							+ config_dev + "/" + configFile + "_" + config_dev + ".properties");
				is = resource.getInputStream();
				propertiesPersister.load(props, new InputStreamReader(is, DEFAULT_ENCODING));
			} catch (IOException ex) {
				logger.error("Could not load properties from classpath:" + configFile + ": " + ex);
			} finally {
				try {
	                if(null != is) {
	                	is.close();
	                }
	            } catch (IOException e) {
	                logger.error("PropertiesUtil 文件流关闭出现异常：", e);
	            }
			}
		}
		logger.info("加载properties文件内容完成...........");
	}
	
	public static String getProperty(String key) {
		String value = props.getProperty(key.trim());
		
		// 判断value是否为空
		if (StringUtils.isBlank(value)) {
			return null;
		}
		return value.trim();
	}

	/**
	 * 
	 * @Title: getProperty
	 * @Description: key无值时，返回默认值
	 * @return: String
	 * @date 2020-04-21 22:40:34
	 */
	public static String getProperty(String key, String defaultValue) {

		String value = props.getProperty(key.trim());
		if (StringUtils.isBlank(value)) {
			value = defaultValue;
		}
		return value.trim();
	}
	
}
